home *** CD-ROM | disk | FTP | other *** search
/ 64'er 1989 July / 64er_Magazin_89-07_1989_Markt__Technik_de_Side_A.d64 / declare 88 src (.txt) < prev    next >
Commodore BASIC  |  2022-10-26  |  22KB  |  590 lines

  1. 0 poke53280,11:poke53281,15:printchr$(144):end
  2. 10 sys9*4096:.opt oo:*=$c000
  3. 20 ; *** programmteiladressen ***
  4. 29 prg0a = $7300:prg0e = $73ff
  5. 30 prg1a = $c000:prg1e = $c3ff
  6. 34 prg3a = $8000:prg3e = $83ff
  7. 35 prg4a = $d400:prg4e = $d7ff
  8. 150 lo = 167:hi = 168:lo2 = 169:hi2 = 170
  9. 155 strpt = 178;179:counter = 180;181
  10. 156 startadr = 250
  11. 160 data = $83:rem = $8f:print = $99
  12. 180 pnt2 = $49:charout = $ab47
  13. 200 char = 8:count = 11:pnt = $71
  14. 230 quote = $22:flag = 15:txtptr = $7a
  15. 260 buffer = $200:table = $a09e
  16. 265 ready = $a474:ckcom = $aefd
  17. 270 speicher = $7000:cassette = 828
  18. 301 ; neue commands
  19. 303 cmdstart = $cc:cmdlast = $d1:funend = $ff
  20. 375 ; *********************
  21. 376 ; *** programmteil1 ***
  22. 378 ; *** interpreter neu ***
  23. 440 tokenread ldx txtptr:ldy #4:sty flag
  24. 450 jsr down:jsr nextchar:pha:jsr up:pla:jmp $a609
  25. 570 ; fuer vergleich mit table auftauchen
  26. 580 l575 jsr up:jsr compare:jmp down; back to nextchar
  27. 2000 ; *** neue list-routine ***
  28. 2030 tokenlist bpl out
  29. 2033 bit flag:bmi out;quot-modus
  30. 2035 cmp #$ff:beq out
  31. 2040 cmp #$cc:bcs newlist
  32. 2050 jmp $a724:out jmp $a6f3
  33. 2055 newlist cmp cmdend:bcc l2060
  34. 2058 sbc funstart:clc:adc cmdend
  35. 2060 l2060 sec:sbc #$cb:tax:sty pnt2
  36. 2065 lda #<(newtab-1):sta lo:lda #>(newtab-1):sta hi:ldy #0:beq l2085
  37. 2080 loop iny:bne l2080:inc hi:l2080 lda (lo),y:bpl loop
  38. 2085 l2085 dex:bne loop
  39. 2090 found iny:bne l2095:inc hi
  40. 2095 l2095 lda (lo),y:bmi oldend:jsr charout:bne found
  41. 2100 oldend jmp $a6ef
  42. 3000 ; *** commands ausfuehren ***
  43. 3020 typflag = 13:chrget = $73:chr(NULL)t = chrget+6
  44. 3030 execold = $a7ed:inter = $a7ae:funktold = $ae8d
  45. 3040 getterm = $aef1:checknum = $ad8d
  46. 3050 ; *** procedures ***
  47. 3110 newcmd jsr chrget:jsr testcmd:jmp inter
  48. 3120 testcmd cmp #cmdstart:bcc oldcmd:cmp cmdend:bcc cmd2
  49. 3130 oldcmd jsr chr(NULL)t:jmp execold
  50. 3140 cmd2 sec:sbc #cmdstart:asl:tay
  51. 3145 lda #<cmdtab:sta lo:lda #>cmdtab:sta hi
  52. 3150 iny:lda (lo),y:dey:pha:lda (lo),y:pha:jmp chrget
  53. 3155 ; *** functions ***
  54. 3160 newfun lda #0:sta typflag:jsr chrget:cmp funstart:bcc oldfun
  55. 3170 cmp #funend:bcc fun2
  56. 3180 oldfun jsr chr(NULL)t:jmp funktold
  57. 3190 fun2 sec:sbc funstart:asl:clc:adc funtabanf:sta jumpind+1
  58. 3192 lda funtabanf+1:adc #0:sta jumpind+2
  59. 3194 jsr chrget:jsr getterm:jsr jumpind:jmp checknum
  60. 3210 jumpind jmp ($ffff)
  61. 3300 ; *****************************
  62. 3302 ; *** procedure deklarieren ***
  63. 3312 procedure lda #1:jsr declare
  64. 3314 proc2 inc cmdend
  65. 3320 lda funstranf:clc:adc strlen:sta funstranf:bcc l3338:inc funstranf+1
  66. 3338 l3338 lda funtabanf:clc:adc #2:sta funtabanf:bcc l3342:inc funtabanf+1
  67. 3342 l3342 rts
  68. 3400 ; ****************************
  69. 3402 ; *** funktion deklarieren ***
  70. 3411 function lda #0:jsr declare
  71. 3420 funct2 dec funstart:rts
  72. 3510 ; ******************************
  73. 3511 ; ** fun/proc/pack name lesen **
  74. 3520 title jsr strevl:sta titlen:sty titpoint+1:stx titpoint
  75. 3525 jsr $e200:stx device:lda #0:sta adressen:rts
  76. 3530 ; ******************************
  77. 3531 ; test, ob cmd dekl. werden kann
  78. 3532 ; name im buffer
  79. 3535 dekltest jsr compare:bne error19; redefinition
  80. 3540 ; testen, ob nummer frei
  81. 3542 lda funstart:cmp cmdend:beq error16:rts
  82. 3550 error16 ldx #16; out of (NULL) :.byte $2c
  83. 3552 error19 ldx #19:jmp error; redim error
  84. 3598 ; ********************************
  85. 3599 ; ** proc/fun laden/assemblieren *
  86. 3600 declare sta type:jsr title:jsr dekltest
  87. 3601 jsr vorb; ckcom/opfile
  88. 3615 jsr inpstring;down
  89. 3630 jsr decl2; header und prgteil
  90. 3693 ; ** command (title) einbauen
  91. 3695 lda titpoint:sta strpt:lda titpoint+1:sta strpt+1
  92. 3698 lda titlen:sta strlen:jsr einbauen:jmp up
  93. 3700 ; ********************************
  94. 3701 ; ** zeichenkette nach (strpt)  **
  95. 3703 ; **   ende mit doppelpunkt    **
  96. 3704 ; ** kehrt in down-mode zurueck **
  97. 3710 inpstring jsr up:lda device:bne l3716
  98. 3712 jsr strevl:jmp down; device 0
  99. 3716 l3716 lda commend:sta strpt:lda commend+1:sta strpt+1:ldy #0
  100. 3718 ; *** header muss geholt werden
  101. 3720 l3720 lda device:cmp #1:beq l3725
  102. 3721 ; *** .asc von disk  **
  103. 3722 jsr $e112:bit 144:bvc l3728
  104. 3723 l3723 ldx #11:jmp error; syntax
  105. 3724 ; *** .asc im speicher abgelegt **
  106. 3725 l3725 lda (startadr),y
  107. 3728 l3728 sta (strpt),y:iny:beq l3723:cmp #":":bne l3720
  108. 3730 tya:sta strlen
  109. 3732 l3732 clc:adc startadr:sta startadr:bcc l3734:inc startadr+1
  110. 3734 l3734 jmp down
  111. 3777 ; ********************************
  112. 3778 ; * string auswerten, strpt setzen
  113. 3780 strevl jsr $ad9e:jsr $b6a3:sta strlen:sty strpt+1:stx strpt:rts
  114. 4000 ; ************************
  115. 4001 ; *** pack deklarieren ***
  116. 4012 pack jsr title:lda commend:sta prganf:lda commend+1:sta prganf+1
  117. 4035 lda #2:sta type:jsr vorb; ckcom/opfile
  118. 4105 jsr inpstring;down
  119. 4110 jsr pac2; header,prgteil holen:jmp up
  120. 4160 ; ** aus pac2 fuer dekltest auftauchen
  121. 4165 l4165 jsr up:jsr dekltest:jmp down; back nach pac2
  122. 4200 ; *****************************
  123. 4201 ; ** header-read vorbereiten **
  124. 4202 vorb lda device:beq l4218
  125. 4204 cmp #8:beq l4214
  126. 4206 ; *** device 1, aus speicher - startadr holen
  127. 4208 jsr ckcom:jsr $ad8a:jsr $bc9b
  128. 4210 lda $65:sta startadr:lda $64:sta startadr+1:rts
  129. 4212 ; ** nur device 8
  130. 4214 l4214 jmp opfile;rts
  131. 4216 ; ** nur device 0
  132. 4218 l4218 jmp ckcom;rts
  133. 4300 ; ******************************
  134. 4301 ; * up,programmteil holen,down *
  135. 4310 inprg jsr up:lda device:beq l4316:cmp #1:beq l4320
  136. 4313 ; ** nur device 8
  137. 4314 jmp infile;load,down,anpassen
  138. 4315 ; ** nur device 0
  139. 4316 l4316 jmp asmprg; assemblieren,down
  140. 4318 ; *** nur device 1 - nach commend kopieren ,down, anpassen
  141. 4320 l4320 ldy #0:lda (startadr),y:sta endadr:iny:lda (startadr),y:sta endadr+1
  142. 4322 lda #2:jsr l3732; startadresse+accu, down
  143. 4326 ; *** 4328-4336 down-mode ***
  144. 4328 l4328 lda commend:sta lo:lda commend+1:sta hi
  145. 4329 lda startadr:sta lo2:lda startadr+1:sta hi2:ldy #0
  146. 4330 l4330 lda (lo2),y:sta (lo),y
  147. 4332 inc lo2:bne l4333:inc hi2
  148. 4333 l4333 inc lo:bne l4334:inc hi
  149. 4334 l4334 sec:lda lo2:sbc endadr:lda hi2:sbc endadr+1:bcc l4330
  150. 4336 jmp adranp
  151. 5101 ; ********************************
  152. 5102 ; string (strpt) mit tables vergl.
  153. 5103 ;ergebnis a>0 count-nr des tokens
  154. 5104 ;        a=0 token nicht definiert
  155. 5110 ; *** mit rom-table ***
  156. 5120 compare lda #0:sta count
  157. 5122 lda #>table:sta hi:lda #<table:sta lo:jsr compsub:bne l5274
  158. 5130 ; *** mit newtab ***
  159. 5140 compare2 lda #>newtab:sta hi:lda #<newtab:sta lo
  160. 5142 lda #cmdstart:sta count
  161. 5220 ; ********************************
  162. 5222 ; ** mit table (lo/hi) vergleichen
  163. 5230 compsub lda #0:sta complen
  164. 5245 l5245 ldy #0
  165. 5248 l5248 lda (strpt),y:sec:sbc (lo),y:iny:and #$ff:beq l5248
  166. 5250 cmp #$80:beq l5270
  167. 5251 inc count:dey:dey
  168. 5252 l5252 iny:lda (lo),y:bpl l5252:iny:lda (lo),y:beq l5272
  169. 5255 tya:clc:adc lo:sta lo:bcc l5245:inc hi:bne l5245
  170. 5270 l5270 ora count:sty complen
  171. 5272 l5272 sta count
  172. 5274 l5274 rts
  173. 5500 ; ********************
  174. 5501 ; *** memory-dump  ***
  175. 5504 memory lda #<newtab:sta lo:lda #>newtab:sta hi:ldy #0
  176. 5506 l5506 lda (lo),y:beq l5520:bpl l5512
  177. 5510 l5510 and #127:jsr $f1ca:lda #13
  178. 5512 l5512 jsr $f1ca:iny:bne l5506:inc hi:bne l5506
  179. 5518 ; *** anfang und ende des procedurespeichers ***
  180. 5520 l5520 lda commands+1:ldx commands:jsr $bdcd
  181. 5522 lda #"-":jsr $f1ca
  182. 5524 lda commend+1:ldx commend:jmp $bdcd
  183. 5600 ; *******************************
  184. 5601 ; *** ascii-zahl im buffer -> int
  185. 5602 ; *** aus down, ende mit down
  186. 5604 buffint jsr up:lda $7a:pha:lda $7b:pha
  187. 5606 lda strpt+1:sta $7b:lda strpt:sta $7a:jsr $0079:jsr $bcf3:jsr $bc9b
  188. 5608 lda $7a:sta strpt:lda $7b:sta strpt+1
  189. 5610 pla:sta $7b:pla:sta $7a:jmp down
  190. 6200 ; ********************************
  191. 6201 ; ** programmteil von disk lesen *
  192. 6202 ; ** und adressen anpassen       *
  193. 6216 infile lda commend:sta lo:lda commend+1:sta hi
  194. 6220 basin jsr $ffcf:ldy #0:sta (lo),y
  195. 6224 inc lo:bne l6226:inc hi
  196. 6226 l6226 bit 144:bvc basin
  197. 6240 ; *** file schliessen ***
  198. 6244 l6244 jsr close:jsr down:jmp adranp
  199. 6300 ; ***************************
  200. 6301 ; *** object file oeffnen ***
  201. 6302 ; filename komplettieren
  202. 6303 opfile lda #1:jsr $ffc3;file1 schliessen
  203. 6304 lda #1:ldx device:ldy #2:jsr $ffba:ldy #0:ldx #0
  204. 6306 l6306 lda (strpt),y:sta cassette,y:iny:cpy strlen:bne l6306
  205. 6308 l6308 lda type:cmp #2:beq l6312
  206. 6309 ; *** name.obj ***
  207. 6310 lda objstr,x:bne l6314
  208. 6311 ; *** name.pac ***
  209. 6312 l6312 lda pacstr,x
  210. 6314 l6314 sta cassette,y:iny:inx:cpx #4:bne l6308
  211. 6315 ; ** file open **
  212. 6316 l6316 tya:ldx #<cassette:ldy #>cassette:jsr $ffbd:jsr $ffc0
  213. 6320 ; ** error control #2,8,15 **
  214. 6322 lda #2:ldx device:ldy #15:jsr $ffba
  215. 6324 lda #0:jsr $ffbd:jsr $ffc0:ldx #2:jsr $ffc6
  216. 6326 jsr $ffcf:cmp #48:beq l6328:ldx #4:jmp error; file not found
  217. 6328 l6328 jsr $ffcc:ldx #1:jsr $ffc6; file1
  218. 6330 jsr $ffcf:sta startadr:jsr $ffcf:sta startadr+1:rts
  219. 6410 ; *************************
  220. 6411 ; *** close files #1,#2 ***
  221. 6412 close jsr $ffcc:lda #1:jsr $ffc3:lda #2:jsr $ffc3:jmp $fd15
  222. 6420 ; *****************************
  223. 6422 ; *** error aus ram ebene 2 ***
  224. 6424 error jsr up:txa:pha:jsr close:pla:tax:jmp $a43a
  225. 6500 ; *****************************
  226. 6501 ; *** system initialisieren ***
  227. 6510 init jsr down:jmp l16504
  228. 6600 ; *****************************
  229. 6601 ; *** speicherkonfiguration ***
  230. 6610 down sei:lda 1:and #248:sta 1:rts
  231. 6612 up lda 1:ora #7:sta 1:cli:rts
  232. 7450 ; *****************************
  233. 7451 ; *** programm assemblieren ***
  234. 7452 ; startadresse hinterlegen
  235. 7454 asmprg tsx:stx var:jsr down:jsr l16304
  236. 7460 jmp $9000
  237. 7461 ; assembler normalisieren
  238. 7462 back jsr down:jsr l16312
  239. 7469 ; wieder in asm springen
  240. 7470 jsr $9ddb:tsx:cpx var:bne l7472:jmp down; rts
  241. 7472 l7472 jmp ready
  242. 7500 ; ** leerbytes bis variablenanf.
  243. 9000 ; ************************
  244. 9001 ; *** variablenbereich ***
  245. 9002 *=$c480 ; 48 bytes - $c4b0
  246. 9020 type .byte $ff
  247. 9025 commands .word speicher:commend .word speicher
  248. 9304 cmdend .byte cmdlast; +5 (proc+fun+in+mem+pac)
  249. 9305 funstart .byte funend
  250. 9307 funstranf .word funstrtab
  251. 9308 funstrend .word funstrtab
  252. 9310 funtabanf .word funtab
  253. 9312 funtabend .word funtab
  254. 9315 endadr .word 00   ; altes programm
  255. 9317 prganf .word 00   ; des neuen
  256. 9318 prgend .word 00   ; programms
  257. 9368 titpoint .word 00:titlen .byte 0
  258. 9369 strlen .byte 0
  259. 9371 complen .byte 0:insanf .word 00
  260. 9372 adressen .byte 00:usadr .word 00
  261. 9373 device .byte 00:var .byte 00
  262. 9375 objstr .asc ".obj"
  263. 9376 pacstr .asc ".pac"
  264. 10000 ; *********************
  265. 10001 ; *** programmteil2 ***
  266. 10002 ; *********************
  267. 10100 *=$8000
  268. 10350 ; ***************************
  269. 10352 ; *** interpreter part ii ***
  270. 10380 nextchar lda buffer,x:bpl normal:inx:cmp #$ff:bne nextchar:dex
  271. 10410 ; * alle zeichen <128 und $ff=(NULL) *
  272. 10440 normal bit flag:bvs takchar;datazeile
  273. 10490 cmp #"?":beq chr63
  274. 10560 ; *** auf tokens testen ***
  275. 10570 checktoken sty pnt:stx txtptr
  276. 10575 stx strpt:lda #2:sta strpt+1:jsr l575; comp mit tables
  277. 10576 lda complen:clc:adc txtptr:tax:ldy pnt
  278. 10580 lda count:beq notfound:dex:cmp cmdend:bcc takchar
  279. 10585 sec:sbc cmdend:clc:adc funstart:bne takchar
  280. 10590 ; *******************
  281. 10710 chr63 lda #print:bne takchar
  282. 10715 ; *******************
  283. 10720 notfound lda buffer,x
  284. 10730 ; *** zeichen uebernehmen ***
  285. 10731 ; und auf ":",data,rem testen
  286. 10740 takchar inx:iny:sta buffer-5,y
  287. 10760 cmp #0:beq ende; * zeilenende *
  288. 10770 ; ** test auf hochkomma **
  289. 10771 cmp #quote:beq chr34
  290. 10780 ; ** test auf ":" **
  291. 10781 cmp #":":bne l10791:lda #0:sta flag
  292. 10790 ; ** test auf data **
  293. 10791 l10791 cmp #data:bne l10801:lda #64:sta flag
  294. 10800 ; ** test auf rem **
  295. 10801 l10801 cmp #rem:bne nextchar
  296. 10810 ; ******************
  297. 10845 chr34 sta char
  298. 10850 ; *** text uebernehmen ***
  299. 10860 copytext lda buffer,x:iny:inx:sta buffer-5,y
  300. 10870 cmp char:beq nextchar:cmp #0:bne copytext
  301. 10875 ende rts; zeilenende
  302. 12900 ; *********************
  303. 12901 ; ** file bearbeiten **
  304. 12910 l12910 ldx #11:jmp error; syntax
  305. 12920 ; *** header lesen ***
  306. 12921 ; *** "nur bei pack:"
  307. 12922 ; ** "procedure oder function"
  308. 12975 pac2 jsr compare2:sec:sbc #cmdstart:cmp #2:bcs l12910
  309. 12990 eor #1:sta type:lda complen:jsr addstrp:jsr nextchr:cpx #32:bne l12910
  310. 13004 jsr l4165; dekltest up:ldy #$ff
  311. 13010 ; *** strlen bestimmen ***
  312. 13012 l13012 iny:lda (strpt),y:beq l12910:cmp #quote:beq l12910
  313. 13014 cmp #",":beq l13020:cmp #":":bne l13012
  314. 13020 l13020 sty strlen:jsr einbauen:lda strlen:jsr addstrp
  315. 13030 lda type:beq l13030:jsr proc2:bne l13040:l13030 jsr funct2
  316. 13040 l13040 lda prganf:clc:adc #3:sta prganf:bcc l13045:inc prganf+1
  317. 13045 l13045 jsr nextchr:cpx #",":beq pac2:cpx #":":bne l12910
  318. 13060 lda device:beq decl2:jsr inpstring
  319. 13100 ; *************************
  320. 13102 ; * 'program' oder 'using'
  321. 13104 ; * "pack" und solo-deklarationen
  322. 13108 decl2 jsr txvergl; x 0=us,1=prg:txa:bne l13210
  323. 13110 jsr nextchr:cpx #32:bne l13452
  324. 13115 ; ** using-statement bearbeiten
  325. 13120 l13120 jsr compare2:beq l13450
  326. 13124 lda complen:jsr addstrp
  327. 13126 jsr nextchr:cpx #",":bne l13452
  328. 13128 jsr usingadr:jsr buffint
  329. 13135 lda usadr:clc:adc $65:pha:lda usadr+1:adc $64:pha:inc adressen
  330. 13140 jsr nextchr:cpx #",":beq l13120:cpx #":":bne l13452; syntax
  331. 13142 lda device:beq l13144:jsr inpstring
  332. 13143 ; ** header-test auf "program:"
  333. 13144 l13144 jsr txvergl:txa:beq l13452
  334. 13200 ; ** "program:" -> prgteil laden
  335. 13210 l13210 jsr nextchr:cpx #":":bne l13452
  336. 13212 lda commend:sta prganf:lda commend+1:sta prganf+1:jsr inprg
  337. 13220 ; * ggf. using-adressen einsetzen
  338. 13221 ; * usingausw nicht mit jsr
  339. 13226 lda adressen:beq l13230:jmp usingausw; mit jmp zurueck
  340. 13228 ; ** commands-ende setzen
  341. 13230 l13230 lda prgend:sta commend:lda prgend+1:sta commend+1:rts
  342. 13430 ; *********************
  343. 13431 ; ** fehlermeldungen **
  344. 13450 l13450 ldx #17:.byte $2c; undef'd statement
  345. 13452 l13452 ldx #11:jmp error; syntax
  346. 13500 ; *******************************
  347. 13501 ; * (strpt) mit 'using','program'
  348. 13502 ; * vergl. x -> 0=using,1=program
  349. 13510 txvergl lda #>ustab:sta hi:lda #<ustab:sta lo:lda #0:sta count
  350. 13520 jsr compsub:beq l13452
  351. 13524 and #1:tax:lda complen:bne addstrp;rts
  352. 13600 ; ******************************
  353. 13601 ; * next char bei (strpt) -> x *
  354. 13602 ; * und strpt increment
  355. 13605 nextchr ldy #0:lda (strpt),y:tax:lda #1
  356. 13608 ; *** akku zu strpt addieren **
  357. 13610 addstrp clc:adc strpt:sta strpt:bcc l13612:inc strpt+1
  358. 13612 l13612 rts
  359. 13708 ; ****************************
  360. 13709 ; * commamd (strp) einbauen **
  361. 13710 ; * stringtabelle schieben
  362. 13711 ; * funstrend + len
  363. 13712 einbauen ldx strlen:lda funstranf:sta insanf:lda funstranf+1:sta insanf+1
  364. 13714 lda funstrend:sta lo:clc:adc strlen:sta funstrend
  365. 13716 lda funstrend+1:sta hi:adc #0:sta funstrend+1:jsr insert
  366. 13720 ; *** string in newtab ***
  367. 13721 ldy #0
  368. 13722 l13722 lda (strpt),y:sta (lo),y:iny:cpy strlen:bne l13722
  369. 13724 dey:lda (lo),y:ora #$80:sta (lo),y
  370. 13738 ; * adressentabelle schieben
  371. 13739 ; * funtabend + 2
  372. 13740 ldx #2:lda funtabanf:sta insanf:lda funtabanf+1:sta insanf+1
  373. 13742 lda funtabend:sta lo:clc:adc #2:sta funtabend
  374. 13750 lda funtabend+1:sta hi:adc #0:sta funtabend+1:jsr insert
  375. 13778 ; *** anf.adr in tabelle ***
  376. 13779 ; *** procs    adr=anf-1 ***
  377. 13780 ldy #0:sec:lda prganf:sbc type:sta (lo),y:iny
  378. 13784 lda prganf+1:sbc #0:sta (lo),y:rts
  379. 14725 ; *******************************
  380. 14732 ; ** using-adresse nach usadr  **
  381. 14733 ; in count using-token-nr
  382. 14740 usingadr lda count:sbc #cmdstart:asl a:tay
  383. 14742 lda cmdend:clc:sbc count
  384. 14750 ; proc -> carry set -> adresse+1
  385. 14752 ; func -> carry clr -> adresse+0
  386. 14770 ; * tab-adresse +carry -> usadr *
  387. 14772 lda #<cmdtab:sta lo:lda #>cmdtab:sta hi
  388. 14773 lda (lo),y:adc #0:sta usadr
  389. 14774 iny:lda (lo),y:adc #0:sta usadr+1:rts
  390. 14800 ; *****************************
  391. 14801 ; * programmteil von disk     *
  392. 14802 ; * teil2 - adressen anpassen *
  393. 14845 adranp lda commend:sta counter:lda commend+1:sta counter+1
  394. 14850 ; ** prglen (a/y)= hi/lo-prganf
  395. 14852 lda lo:sta prgend:sec:sbc prganf:tax;prglen-lo
  396. 14854 lda hi:sta prgend+1:sbc prganf+1:tay;prglen-hi
  397. 14860 ; ** endadr=startadr+prglen (a/y)
  398. 14862 txa:clc:adc startadr:sta endadr
  399. 14864 tya:adc startadr+1:sta endadr+1
  400. 14900 ; *******************************
  401. 14902 ; ** absolute adressen suchen ***
  402. 14903 ; ** bis unbrauchbares zeichen **
  403. 14904 ; ** z.b. $ff **
  404. 14910 adapt ldy #0:lda (counter),y:cmp #$ff:beq l4924:tax:dey
  405. 14911 l14911 iny:txa:and masktab,y:cmp bittab,y:bne l14911
  406. 14914 lda lentab,y:cmp #3:bne l4918:pha:jsr absolut:pla
  407. 14918 l4918 clc:adc counter:sta counter:bcc l4920:inc counter+1
  408. 14920 l4920 sec:sbc prgend:lda counter+1:sbc prgend+1:bcc adapt
  409. 14924 l4924 rts
  410. 14950 ; *** absolute adr < startadresse
  411. 14954 absolut ldy #1:sec:lda (counter),y:sbc startadr
  412. 14956 iny:lda (counter),y:sbc startadr+1:bcc l4988
  413. 14965 ; *** abs.adr > endadresse
  414. 14970 ldy #1:sec:lda endadr:sbc (counter),y
  415. 14972 iny:lda endadr+1:sbc (counter),y:bcc l4988
  416. 14980 ; *** abs.adr. anpassen ***
  417. 14982 l4982 ldy #1:lda (counter),y:sec:sbc startadr:tax; lo
  418. 14984 iny:lda (counter),y:sbc startadr+1:pha; hi
  419. 14986 dey:txa:clc:adc prganf:sta (counter),y
  420. 14988 iny:pla:adc prganf+1:sta (counter),y:l4988 rts
  421. 14995 ; *****************************
  422. 14996 ; **  using-plaetze suchen    *
  423. 14997 ; ** adressen aus stack holen *
  424. 15001 ; **  und einsetzen           *
  425. 15002 usingausw tsx:txa:clc:adc adressen:adc adressen:tax:txs
  426. 15004 lda prganf:sta counter:lda prganf+1:sta counter+1
  427. 15005 l15005 ldy #0:lda (counter),y:iny:and (counter),y:cmp #$ff:beq adrein
  428. 15008 inc counter:bne l15010:inc counter+1
  429. 15010 l15010 sec:lda counter:sbc prgend:lda counter+1:sbc prgend+1:bcc l15005
  430. 15015 ; ** kein platz fuer using-adr **
  431. 15020 ldx #13:jmp error; out of data error
  432. 15028 ; ** adr aus stack-bereich holen
  433. 15030 adrein lda $0100,x:dey:sta (counter),y
  434. 15032 iny:dex:lda $0100,x:sta (counter),y:dex
  435. 15034 dec adressen:bne l15005:jmp l13230; praktisch rts
  436. 15600 ; *** platz schaffen ***
  437. 15601 ; ** im x-reg anzahl ***
  438. 15602 ; ** von insanf bis lo/hi **
  439. 15603 insert stx var
  440. 15605 l5605 ldy #0:lda (lo),y:ldy var:sta (lo),y
  441. 15610 sec:lda insanf:sbc lo:lda insanf+1:sbc hi:bcs l5620
  442. 15615 dec lo:lda lo:cmp #$ff:bne l5605:dec hi:bne l5605
  443. 15620 l5620 rts
  444. 16500 ; *****************************
  445. 16501 ; *** system initialisieren ***
  446. 16504 l16504 lda #cmdlast:sta cmdend:lda #funend:sta funstart
  447. 16506 lda #<funstrtab:sta funstranf:sta funstrend
  448. 16507 lda #>funstrtab:sta funstranf+1:sta funstrend+1
  449. 16510 lda #<funtab:sta funtabanf:sta funtabend
  450. 16511 lda #>funtab:sta funtabanf+1:sta funtabend+1
  451. 16515 lda commands:sta commend:lda commands+1:sta commend+1
  452. 16518 lda #0:sta funtab:sta funtab+1:sta funstrtab:sta funstrtab+1:jmp up
  453. 17050 ; *** disass-daten ***
  454. 17051 ; bytes pro befehl $00 - $ff
  455. 17052 .byte $ff
  456. 17060 masktab .byte %00001100;$xc,xd,xe,xf
  457. 17061 .byte %11111111;$20
  458. 17062 .byte %10011111;$00,40,60
  459. 17063 .byte %00001000;$x0-x7
  460. 17064 .byte %00001101;$x8,xa
  461. 17065 .byte %00011101;hi 2x+lo 9,b
  462. 17066 .byte %11011111;$9b,bb
  463. 17067 .byte %00011101;hi(2x+1)+lo 9,b
  464. 17070 bittab .byte %00001100
  465. 17071 .byte %00100000
  466. 17072 .byte %00000000
  467. 17073 .byte %00000000
  468. 17074 .byte %00001000
  469. 17075 .byte %00001001
  470. 17076 .byte %10011011
  471. 17077 .byte %00011001
  472. 17080 lentab .byte 3,3,1,2,1,2,1,3
  473. 18300 ; *****************************
  474. 18301 ; *** programm assemblieren ***
  475. 18302 ; startadresse hinterlegen
  476. 18304 l16304 lda commend:sta $902e:lda commend+1:sta $9032
  477. 18307 ; asm veraendern
  478. 18308 lda #$2c:sta $9620
  479. 18309 lda #$4c:sta $986c:lda #>back:sta $986e:lda #<back:sta $986d:jmp up
  480. 18311 ; asm normalisieren
  481. 18312 l16312 lda #$a2:sta $9620
  482. 18313 lda #$20:sta $986c:lda #$9d:sta $986e:lda #$db:sta $986d
  483. 18314 ; endadresse besorgen
  484. 18315 lda $4f:sta prgend:lda $50:sta prgend+1
  485. 18316 jmp up
  486. 28600 *= $c400
  487. 28601 ; cmdtab+funtab < 128bytes, max. 51 eintraege -> bis $cc7f
  488. 28602 ; *** adressentabelle ***
  489. 28702 cmdtab .word procedure-1
  490. 28703 .word function-1
  491. 28704 .word pack-1
  492. 28705 .word memory-1
  493. 28706 .word init-1
  494. 28720 funtab .word 00
  495. 28730 ; $c480 variablenspeicher 48 bytes
  496. 28739 *=$c4b0
  497. 28750 ustab .asc "usin[199]"
  498. 28752 .asc "progra[205]"
  499. 28754 .byte 00
  500. 28798 ; **** stringtabelle ***
  501. 28800 newtab .asc "procedur[197]"
  502. 28801 .asc "functio[206]"
  503. 28802 .asc "pac[203]"
  504. 28803 .asc "memor[217]"
  505. 28804 .asc "ini[212]"
  506. 28820 funstrtab .word 00
  507. 39110 *=$304:.byte <tokenread,>tokenread
  508. 39120 *=$306:.byte <tokenlist,>tokenlist
  509. 39130 *=$308:.byte <newcmd,>newcmd
  510. 39140 *=$30a:.byte <newfun,>newfun
  511. 40500 ; ****** programmteil 2 ********
  512. 40501 ; *** nach $d400 uebertragen ***
  513. 40510 *=$7000; 28672
  514. 40511 ; adressen in prgteil1 aendern
  515. 40514 lda #<prg3a:sta startadr:lda #>prg3a:sta startadr+1
  516. 40516 lda #<prg3e:sta endadr:lda #>prg3e:sta endadr+1
  517. 40520 lda #<prg1a:sta counter:lda #>prg1a:sta counter+1
  518. 40522 lda #<prg1e:sta prgend:lda #>prg1e:sta prgend+1
  519. 40530 lda #<prg4a:sta prganf:lda #>prg4a:sta prganf+1
  520. 40535 jsr down:jsr adapt:jsr down
  521. 40600 ; prgteil3 nach destination
  522. 40602 lda #<prg3a:sta lo:lda #>prg3a:sta hi
  523. 40604 lda #<prg4a:sta lo2:lda #>prg4a:sta hi2:ldx #4:ldy #$ff:jsr transfer
  524. 40619 ; adressen in prgteil3 aendern
  525. 40624 lda #<prg3a:sta startadr:lda #>prg3a:sta startadr+1
  526. 40626 lda #<prg3e:sta endadr:lda #>prg3e:sta endadr+1
  527. 40630 lda #<prg4a:sta counter:sta prganf:lda #>prg4a:sta counter+1:sta prganf+1
  528. 40632 lda #<prg4e:sta prgend:lda #>prg4e:sta prgend+1
  529. 40645 jsr down:jsr adapt:jmp up
  530. 42001 ; *** alles runterkopieren ***
  531. 44000 ; *** programmteile sammeln ***
  532. 44001 ; *** teil2 bei $d400 ***
  533. 44004 *=$7200;29184
  534. 44030 jsr down:ldy #0:sty 2
  535. 44032 l44032 lda copytab,y:sta lo
  536. 44034 lda copytab+1,y:sta hi
  537. 44036 lda copytab+2,y:sta lo2
  538. 44038 lda copytab+3,y:sta hi2
  539. 44040 lda copytab+4,y:tax
  540. 44042 lda copytab+5,y:tay
  541. 44044 jsr transfer:lda 2:clc:adc #6:sta 2:tay:cmp #30:bne l44032
  542. 44050 ; *** teil0 anpassen ***
  543. 44054 lda #<prg0a:sta startadr:lda #>prg0a:sta startadr+1
  544. 44056 lda #<prg0e:sta endadr:lda #>prg0e:sta endadr+1
  545. 44060 lda #<mid0:sta counter:lda #>mid0:sta counter+1
  546. 44062 lda #$ff:sta prgend:lda #8:sta prgend+1
  547. 44070 lda #0:sta prganf:lda #8:sta prganf+1
  548. 44075 jsr adapt:jmp up
  549. 50000 *=$7300
  550. 50001 ; *** endprogramm ***
  551. 50002 ; *** 40 bytes $0800-0827 ***
  552. 50003 .byte 0,34,8,196,7,158,32,50
  553. 50004 .byte 48,56,56,44,51,50,55,54
  554. 50006 .byte 56,32,66,89,32,87,79,76
  555. 50008 .byte 70,71,65,78,71,32,77,65
  556. 50010 .byte 89,00,00,00,00,00,00,00
  557. 50020 ; *** programm verteilen  ab $0828 **
  558. 50025 sei:lda 1:and #248:sta 1:ldy #0:sty 2
  559. 50032 l50032 lda copytab,y:sta lo2
  560. 50034 lda copytab+1,y:sta hi2
  561. 50036 lda copytab+2,y:sta lo
  562. 50038 lda copytab+3,y:sta hi
  563. 50040 lda copytab+4,y:tax
  564. 50042 lda copytab+5,y:tay
  565. 50044 jsr transfer:lda 2:clc:adc #6:sta 2:tay:cmp #24:bne l50032
  566. 50070 ; *** vektoren setzen ***
  567. 50080 lda #<tokenread:sta $0304:lda #>tokenread:sta $0305
  568. 50082 lda #<tokenlist:sta $0306:lda #>tokenlist:sta $0307
  569. 50084 lda #<newcmd:sta $0308:lda #>newcmd:sta $0309
  570. 50086 lda #<newfun:sta $030a:lda #>newfun:sta $030b
  571. 50090 lda 1:ora #7:sta 1:cli
  572. 50095 ; ** anf.adr des procedurespeichers ablegen ***
  573. 50100 jsr ckcom:jsr $ad8a:jsr $bc9b
  574. 50101 lda $65:sta commands:sta commend:lda $64:sta commands+1:sta commend+1
  575. 50102 ; ** basic ende  $37/38 oder anf-adr proceduresp. **
  576. 50103 cmp $38:bcs l50106
  577. 50104 sta $34:sta $36:sta $38:lda $65:sta $33:sta $35:sta $37
  578. 50106 l50106 jsr $a644; new:jmp $a7ae
  579. 50200 ; *** copy routine ***
  580. 50204 transfer lda (lo),y:sta (lo2),y:dey:cpy #$ff:bne transfer
  581. 50206 inc hi:inc hi2:dex:bne transfer:rts
  582. 50300 ; *** copytab ***
  583. 50302 copytab .word $c000,$0900:.byte 4,$ff
  584. 50304 .word $d400,$0d00:.byte 4,$ff
  585. 50306 .word $c400,$1100:.byte 1,12
  586. 50308 .word $c480,$1110:.byte 1,$80
  587. 50310 .word $7300,$0800:.byte 1,$ff
  588. 50312 mid0 = $0828
  589. 59999 .end:end
  590.